package com.ipan.kits.text;

import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedHashMap;
import java.util.Map;

import org.apache.commons.lang3.StringUtils;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.Yaml;

/**
 * 配置处理工具类
 * 
 * @author yml
 */
public class YamlUtil {
	public static Map<?, ?> loadYaml(String fileName) throws FileNotFoundException {
		InputStream in = YamlUtil.class.getClassLoader().getResourceAsStream(fileName);
		return org.apache.commons.lang3.StringUtils.isNotBlank(fileName) ? (LinkedHashMap<?, ?>) new Yaml().load(in) : null;
	}

	public static void dumpYaml(String fileName, Map<?, ?> map) throws IOException {
		if (StringUtils.isNotEmpty(fileName)) {
			FileWriter fileWriter = new FileWriter(YamlUtil.class.getResource(fileName).getFile());
			DumperOptions options = new DumperOptions();
			options.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);
			Yaml yaml = new Yaml(options);
			yaml.dump(map, fileWriter);
		}
	}

	public static Object getProperty(Map<?, ?> map, Object qualifiedKey) {
		if (map != null && !map.isEmpty() && qualifiedKey != null) {
			String input = String.valueOf(qualifiedKey);
			if (!"".equals(input)) {
				if (input.contains(".")) {
					int index = input.indexOf(".");
					String left = input.substring(0, index);
					String right = input.substring(index + 1, input.length());
					return getProperty((Map<?, ?>) map.get(left), right);
				} else if (map.containsKey(input)) {
					return map.get(input);
				} else {
					return null;
				}
			}
		}
		return null;
	}

	@SuppressWarnings("unchecked")
	public static void setProperty(Map<?, ?> map, Object qualifiedKey, Object value) {
		if (map != null && !map.isEmpty() && qualifiedKey != null) {
			String input = String.valueOf(qualifiedKey);
			if (!input.equals("")) {
				if (input.contains(".")) {
					int index = input.indexOf(".");
					String left = input.substring(0, index);
					String right = input.substring(index + 1, input.length());
					setProperty((Map<?, ?>) map.get(left), right, value);
				} else {
					((Map<Object, Object>) map).put(qualifiedKey, value);
				}
			}
		}
	}
}